import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @作者 钟先崟
 * @时间 2023-03-06 17:52
 * @说明 811. 子域名访问计数
 * 网站域名 "discuss.leetcode.com" 由多个子域名组成。
 * 顶级域名为 "com" ，二级域名为 "leetcode.com" ，最低一级为 "discuss.leetcode.com" 。
 * 当访问域名 "discuss.leetcode.com" 时，同时也会隐式访问其父域名 "leetcode.com" 以及 "com" 。
 * 计数配对域名 是遵循 "rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示，
 * 其中 rep 表示访问域名的次数，d1.d2.d3 为域名本身。
 * 例如，"9001 discuss.leetcode.com" 就是一个 计数配对域名 ，表示 discuss.leetcode.com 被访问了 9001 次。
 * 给你一个 计数配对域名 组成的数组 cpdomains ，
 * 解析得到输入中每个子域名对应的 计数配对域名 ，并以数组形式返回。可以按 任意顺序 返回答案。
 * 示例 2：
 * 输入：cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]
 * 输出：["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
 * 解释：按照前文描述，会访问 "google.mail.com" 900 次，"yahoo.com" 50 次，"intel.mail.com" 1 次，"wiki.org" 5 次。
 * 而对于父域名，会访问 "mail.com" 900 + 1 = 901 次，"com" 900 + 50 + 1 = 951 次，和 "org" 5 次。
 */
public class Solution {
    public static void main(String[] args) {
//        String[] cpdomains = new String[]{"900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"};
        String[] cpdomains = new String[]{"9001 discuss.leetcode.com"};
        for (String subdomainVisit : subdomainVisits(cpdomains)) {
            System.out.print(subdomainVisit + " ");
        }

    }

    /**
     * 执行用时：16 ms, 在所有 Java 提交中击败了42.86% 的用户
     * 内存消耗： 42.2 MB, 在所有 Java 提交中击败了66.07%的用户
     *
     * @param cpdomains
     * @return
     */
    public static List<String> subdomainVisits(String[] cpdomains) {
        HashMap<String, String> map = new HashMap<>();
        for (int i = 0; i < cpdomains.length; i++) {
            String[] split1 = cpdomains[i].split(" ");
            String[] split2 = split1[1].split("\\.");
            String[] strings = cpdomains[i].split(" ");
            for (int j = 0; j < split2.length; j++) {
                String num = map.get(strings[1]);
                if (num == null)
                    map.put(strings[1], split1[0]);
                else {
                    map.replace(strings[1],
                            String.valueOf(Integer.parseInt(split1[0])
                                    + Integer.parseInt(num)));
                }
                strings = strings[1].split("\\.", 2);
            }
        }
        List list = new ArrayList();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            list.add(entry.getValue() + " " + entry.getKey());
        }
        return list;
    }
}
